package com.FundamentalDemos.commonAPI.useString;

import com.FundamentalDemos.commonAPI.Demo;

import java.util.Arrays;

public class useStringFunction {
    public static void main(String[] args) {
        //1
        String s = "黑马Java";
        System.out.println(s.length());//获取字符串长度(中文与英文数字等都算一个字符)
        System.out.println("------------------");

        //-----------------------------------------------

        //2
        System.out.println(s.charAt(1));//返回字符串中指定下标处的字符
        for (int i = 0; i < s.length(); i++) {//s.length.fori遍历字符串
            System.out.print(s.charAt(i));//挨个获取字符
        }
        System.out.println();


        System.out.println("------------------");
        //-----------------------------------------------
        //3
        char[] c = s.toCharArray();//把字符串对象转换成字符数组,然后可以再遍历
        for (int i = 0; i < c.length; i++) {
            System.out.print(c[i]);
        }
        System.out.println();

        System.out.println(s.toCharArray());//可以直接这样输出字符数组

        System.out.println("------------------");
        //-----------------------------------------------
        //4
        String s1 = new String("A"), s2 = new String("A");
        System.out.println(s1 == s2);//不能用==比较字符串,因为这样比较的是地址,而不是内容,所以一定是false
        System.out.println(s1.equals(s2));//要判断内容两个字符串对象是否相同,应该用equals()方法
        System.out.println("------------------");
        //-----------------------------------------------

        /*
        String对象是不可变的,每次改变字符串对象实际上是新产生的字符串对象了,以"abc"方式写出的字符串,会在堆内存中的字符串常量池中存储,且相同内容的字符串只存储一份,目的是节约内存;但是通过new方式创建的字符串对象,每new一次都会产生一个新的对象放在堆内存中
        */

        //如果使用
        s1 = "S";
        s2 = "S";
        System.out.println(s1 == s2);
        //会发现结果始终为true,这是由于java的字符串常量复用造成的,s1 s2 指向同一个地址
        System.out.println(s1.equals(s2));//因为二者就是同一个字符串常量,所以始终为true
        System.out.println("+-+-+-+-+-+-+-+-+");
//笔试题1
        s2 = new String("abc");//这一行就在堆中产生了两个对象,其中一个在堆内存常量池中
        s1 = "abc";//因为常量池中已经有"abc"了,所以不会再创建对象
        System.out.println(s1 == s2);//由于s1 s2指向不同的对象(都在堆内存中,但是一个"abc"在常量池中,一个在常量池外)所以false
        System.out.println("+-+-+-+-+-+-+-+-+");
//笔试题2
        s1 = "abc";//"abc"加入常量池
        s2 = "ab";//"ab"加入常量池
        String s3 = s2 + "c";//"c"加入常量池,同时运算拼成新的字符串会在堆内存中常量池外生成新的对象的,与常量池中已经存在的"abc"无关
        System.out.println(s1 == s3);//false
        System.out.println("+-+-+-+-+-+-+-+-+");
//笔试题3
        s1 = "abc";//在常量池中生成"abc"
        s2 = "a" + "b" + "c";//在常量池中生成"a" "b" "c" "ab" "abc" 尽管是运算拼成的"abc"但是存在常量优化机制,因为运算不涉及变量,所以编译器会把"a"+"b"+"c"直接转成"abc",因此使用的是常量池中已经存在的"abc"
        System.out.println(s1 == s2);//true
        System.out.println("+-+-+-+-+-+-+-+-+");

        //-----------------------------------------------
        //5
        s1 = "ABC";
        s2 = "abc";
        System.out.println(s1.equals(s2));
        System.out.println(s1.equalsIgnoreCase(s2));//无视大小写比较字符串内容
        System.out.println("------------------");
        //-----------------------------------------------
        //6
        s1 = "I hate Java";
        //从字符串对象截取子串
        //publi String substring(int beginIndex, int endIndex) 从起始截取到结尾下标,包前不包后
        //publi String substring(int beginIndex) 从起始截取到字符串末尾
        System.out.println(s1.substring(7));//Java
        System.out.println(s1.substring(0, 6));//I hate
        System.out.println(s1.substring(2, 8));//hate J
        System.out.println("------------------");
        //-----------------------------------------------

        //7
        s1 = "这部电影真垃圾,垃圾电影!!!";
        s2 = s1.replace("垃圾", "**");//使用replace函数可以用指定的字符串替换指定的字符串并返回新的字符串
        System.out.println(s1);
        System.out.println(s2);
        System.out.println("------------------");//-----------------------------------------------

        //8
        String temp = "垃圾";
        System.out.println(s1.contains(temp) ? "\"" + s1 + "\"中含有\"" + temp + "\"" : "\"" + s1 + "\"不含有\"" + temp + "\"");//使用contains方法判断字符串中是否含有指定字符串
        s1 = "嘻嘻哈哈";
        System.out.println(s1.contains(temp) ? "\"" + s1 + "\"中含有\"" + temp + "\"" : "\"" + s1 + "\"中不含有\"" + temp + "\"");
        System.out.println("------------------");//-----------------------------------------------


        //9
        s1 = "这部电影真垃圾,垃圾电影!!!";
        temp = "这";
        System.out.println(s1.startsWith(temp) ? "\"" + s1 + "\"确实是以\"" + temp + "\"开头的" : "\"" + s1 + "\"不是以\"" + temp + "\"开头的");//使用startsWith方法判断字符串是否是以指定字符串开头的
        s1 = "ikun";
        temp = "只因";
        System.out.println(s1.startsWith(temp) ? "\"" + s1 + "\"确实是以\"" + temp + "\"开头的" : "\"" + s1 + "\"不是以\"" + temp + "\"开头的");

        boolean test1 = s1.endsWith("test");//判断字符串是否以某个字符串结尾
        System.out.println("------------------");//-----------------------------------------------

        //10
        s1 = "张三%李四%王五%赵六%胡七";
        temp = "%";
        String[] example = s1.split(temp);//使用split函数将字符串按照指定的字符串作为分割标志,将原字符串分割成多个字符串,返回结果是String[]
        /**
         * 支持正则表达式,所以以.作为分隔符时需要转义"\\.",如 String[] split = fileName.split("\\.");,另外还支持使用|连接多种分隔符,同时分隔,如 String[] strings = str.split("/|\\.");
         */
        System.out.println(Arrays.toString(example));

        System.out.println("------------------");//------------------------------------------------

        //11
        /**
         * public String trim()
         * 返回一个字符串，其值是原字符串，除去任何前导和尾随空格，或者如果该字符串没有前导或尾随的空格，则为原字符串
         * */
        String test = "  1 2 3  ";
        System.out.println(test.trim());

        System.out.println("------------------");//------------------------------------------------
        //12 按照ASCII码值比较字符串大小 public int compareTo(String anotherString)
//      "A".compareTo("B")
//      "A" > "B" 返回正整数
//      "A" < "B" 返回负整数
//      "A" = "B" 返回整数0
        System.out.println("abc".compareTo("ABC"));//32
        System.out.println("ABC".compareTo("abc"));//-32
        System.out.println("abc".compareTo("abc"));//0


        System.out.println("------------------");//------------------------------------------------
        //13 将其他基本类型转成String类型
        System.out.println(String.valueOf(1));
        System.out.println(String.valueOf(true));
        System.out.println(String.valueOf('c'));
        System.out.println(String.valueOf(new char[]{'a', 'b', 'c'}));
        System.out.println(String.valueOf(12.34));
        System.out.println(String.valueOf(2.5f));
        System.out.println(String.valueOf(100L));
        System.out.println(String.valueOf(new Demo()));


        System.out.println("------------------");//------------------------------------------------
        //两种遍历字符串的方式
        String str = "I love Java, not you Python!";
        //1
        for (int i = 0; i < str.length(); i++) {
            System.out.print(str.charAt(i));
        }
        System.out.println();
        //2
        char[] chs = str.toCharArray();
        for (int i = 0; i < chs.length; i++) {
            System.out.print(chs[i]);
        }
        System.out.println();


        //字符串判空
        String str1 = "123";
        if (str1 == null || str1.length() == 0) {//如果String引用为空,或者字符串长度为0,就不需要进行后面的操作了
            return;
        }


    }
}
